home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 4: GNU Archives / Linux Cubed Series 4 - GNU Archives.iso / gnu / glibc-1.09 / glibc-1 / glibc-1.09.1 / sysdeps / unix / sysv / irix4 / __handler.S < prev    next >
Encoding:
Text File  |  1994-07-18  |  3.3 KB  |  117 lines

  1. /* Copyright (C) 1992 Free Software Foundation, Inc.
  2.    Contributed by Brendan Kehoe (brendan@cs.widener.edu).
  3.    Also hacked by Ian Lance Taylor (ian@airs.com).
  4.  
  5. The GNU C Library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Library General Public License as
  7. published by the Free Software Foundation; either version 2 of the
  8. License, or (at your option) any later version.
  9.  
  10. The GNU C Library is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13. Library General Public License for more details.
  14.  
  15. You should have received a copy of the GNU Library General Public
  16. License along with the GNU C Library; see the file COPYING.LIB.  If
  17. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  18. Cambridge, MA 02139, USA.  */
  19.  
  20. #include <sysdep.h>
  21.  
  22. /* This function saves all the registers, calls the
  23.    user function, and then executes a sigreturn system call.  The
  24.    sigreturn call wants the address of a sigcontext structure.  This
  25.    is all hideously system dependent and, for all intents and
  26.    purposes, undocumented.
  27.  
  28.    When we enter here, a3 holds the user's signal handler.  We are
  29.    supposed to fill in the context given in a2, and then pass it and
  30.    the first two arguments to the user's function.  If the user's
  31.    function returns, we execute a sigreturn system call.
  32.  
  33.    The sc_onstack, sc_mask and sc_pc elements of the context are
  34.    already set by the kernel.  For some reason we don't have to save
  35.    the floating point state or the coprocessor state; the kernel may
  36.    have saved them for us, or it doesn't use them.  */
  37.  
  38. .set noat
  39. ENTRY (__handler)
  40. #if 0
  41.     /* Store zero and the asm temp reg.  */
  42.     sw $0, 12(a2)
  43.     sw AT, 16(a2)
  44.  
  45.     /* Put v1 in sc_regs[3].  */
  46.     sw v1, 24(a2)
  47.  
  48.     /* Save the caller saved registers in sc_regs[8..15].  */
  49.     sw t0, 44(a2)
  50.     sw t1, 48(a2)
  51.     sw t2, 52(a2)
  52.     sw t3, 56(a2)
  53.     sw t4, 60(a2)
  54.     sw t5, 64(a2)
  55.     sw t6, 68(a2)
  56.     sw t7, 72(a2)
  57.  
  58.     /* Save the callee saved registers in sc_regs[16..23].  */
  59.     sw s0, 76(a2)
  60.     sw s1, 80(a2)
  61.     sw s2, 84(a2)
  62.     sw s3, 88(a2)
  63.     sw s4, 92(a2)
  64.     sw s5, 96(a2)
  65.     sw s6, 100(a2)
  66.     sw s7, 104(a2)
  67.  
  68.     /* Save the code generator registers in sc_regs[24] & sc_regs[25].  */
  69.     sw t8, 108(a2)
  70.     sw t9, 112(a2)
  71.  
  72.     /* Save the kernel temp regs in sc_regs[26] & sc_regs[27]. */
  73.     sw k0, 116(a2)
  74.     sw k1, 120(a2)
  75.  
  76.     /* Save the global pointer in sc_regs[28].  */
  77.     sw gp, 124(a2)
  78.  
  79.     /* ... and also the return address in sc_regs[31].  */
  80.     sw ra, 136(a2)
  81.  
  82.     /* Note: we don't save the stack pointer in sc_regs[29];
  83.        instead, we use the one that was already there.  */
  84. #if 0
  85.     sw sp, 128(a2)
  86. #endif
  87.  
  88.     /* Save the floating pointer in sc_regs[30].  */
  89.     sw fp, 132(a2)
  90.  
  91.     /* Save the mul/div stuff in sc_mdlo and sc_mdhi.  */
  92.     mflo t0
  93.     sw t0, 140(a2)
  94.     mfhi t0
  95.     sw t0, 144(a2)
  96.  
  97. #endif
  98.     /* Move the stack up six.  This will save the context.  */
  99.     addu sp, sp, -24
  100.     sw a2, 16(sp)
  101.  
  102.     /* Call their handler with the signal, code, and context; note
  103.        this will clobber the context.  */
  104.     .set noreorder
  105.     jal ra, a3
  106.     nop
  107.     .set reorder
  108.  
  109.     /* When we come back, restore the context and pass it right
  110.        on into sigreturn().  */
  111.     lw a0, 16(sp)
  112.  
  113.     /* Do a sigreturn syscall; this doesn't return.  */
  114.     li v0, SYS_sigreturn
  115.     syscall
  116.     nop
  117.